import tkinter as tk
from tkinter import messagebox
import functools

# 模拟数据
data = ['1号桌', '2号桌', '3号桌', '4号桌', '5号桌']
list_data = [1, 2, 3, 4, 5, 6, 7, 8, 9]

# 模拟菜单数据
menu = {
    '1号桌': ['凉菜(花生米)', '热菜(木须肉)', '啤酒'],
    '2号桌': ['米饭', '凉菜(豆腐丝)', '热菜(锅包肉)', '饮料'],
    '3号桌': ['馒头', '热菜(四季豆)']
}

# 拆分菜单为两个队列
menu1 = [['1号桌', '热菜(木须肉)'], ['2号桌', '热菜(锅包肉)'], ['3号桌', '热菜(四季豆)']]
menu2 = [['1号桌', '凉菜(花生米)'], ['1号桌', '啤酒'], ['2号桌', '米饭'], ['2号桌', '凉菜(豆腐丝)'],
         ['2号桌', '饮料'], ['3号桌', '馒头']]

# 模拟缓存机制，使用 functools.lru_cache 作为示例
@functools.lru_cache(maxsize=128)
def cached_function(value):
    # 这里可以是一些需要缓存的复杂计算，这里简单返回原值
    return value


def process_data():
    # 普通的循环
    for i in range(len(data)):
        print(f"{data[i]} 已经擦完")
        # 使用缓存机制示例
        cached_result = cached_function(data[i])
        print(f"缓存结果: {cached_result}")

    # 使用变量减少循环计算次数
    data_len = len(data)
    for i in range(data_len):
        print(f"{data[i]} 已经摆好了餐具")

    # 合并两个 for 循环
    for i in range(data_len):
        print(f"{data[i]} 已经擦完")
        print(f"{data[i]} 已经摆好了餐具")

    # 通过并行减少循环次数，注意循环步长的设置
    for i in range(0, len(list_data), 5):
        print(f"小明拿走了数字： {list_data[i]}")
        # 注意数组元素为空的处理
        print(f"小明的爸爸拿走了数字： {list_data[i + 1] if i + 1 < len(list_data) else ''} "
              f"{list_data[i + 2] if i + 2 < len(list_data) else ''} "
              f"{list_data[i + 3] if i + 3 < len(list_data) else ''} "
              f"{list_data[i + 4] if i + 4 < len(list_data) else ''}")


def process_menu():
    def process_menu1():
        if len(menu1) == 0:
            print('热菜全部做完！')
            return
        else:
            # 删除并返回队列中的第一个元素
            item = menu1.pop(0)
            print(f"{item} 已经做好了！")
            root.after(2000, process_menu1)  # 热菜上的慢

    def process_menu2():
        if len(menu2) == 0:
            print('凉菜全部做完！')
            return
        else:
            item = menu2.pop(0)
            print(f"{item} 已经做好了！")
            root.after(500, process_menu2)  # 凉菜上的快

    process_menu1()
    process_menu2()


def show_message():
    messagebox.showinfo("提示", "处理已开始，请查看终端输出")
    process_data()
    process_menu()


# 创建主窗口
root = tk.Tk()
root.title("缓存和队列")

# 创建按钮
button = tk.Button(root, text="开始处理", command=show_message)
button.pack(pady=20)

# 运行主循环
root.mainloop()